home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / cbibcode.arc / OUTPORTB.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-08-05  |  1.4 KB  |  36 lines

  1. /* outportb.c --- p 525 */
  2. #include <dos.h>
  3. #include <conio.h>
  4. #define TIMER_FREQ     1193180L     /* Timer freq = 1.19 MHz */
  5. #define TIMER_COUNT    0x42         /* 8253 timer -- count       */
  6. #define TIMER_MODE     0x43         /* 8253 timer control port   */
  7. #define TIMER_OSC      0xb6         /*To use timer as oscillator */
  8. #define OUT_8255       0x61         /* 8255 PPI output port adrs */
  9. #define SPKRON           3            /* Bit 0 = control spkr by timer*/
  10.                     /* Bit 1 = speaker on/off       */
  11. main()
  12. {
  13.     unsigned freq, status, ratio, part_ratio;
  14.     char input[81];
  15.     cprintf("Enter frequency in Hz (between 100 and 15000):");
  16.     cscanf("%hu", &freq);
  17.             /* First read and save status of the 8255 chip */
  18.     status = inportb (OUT_8255);
  19.                     /* Put timer in oscillator mode */
  20.     outportb (TIMER_MODE, TIMER_OSC);
  21.     ratio = (unsigned)(TIMER_FREQ/freq);
  22.     part_ratio = ratio & 0xff;         /* low byte of ratio     */
  23.     outportb(TIMER_COUNT, part_ratio);
  24.     part_ratio = (ratio >> 8) & 0xff;     /* high byte      */
  25.     outportb(TIMER_COUNT, part_ratio);
  26.                         /* Finally turn on speaker */
  27.     outportb (OUT_8255, (status : SPKRON));
  28.                 /* Ask user to indicate when to stop the
  29.                  * annoying tone... */
  30.     cprintf("\nHit return to exit:");
  31.     cgets(input);
  32.                         /* Now turn off speaker */
  33.     status = inportb (OUT_8255);         /* get current status */
  34.                         /* Turn speaker off */
  35.     outportb (OUT_8255, (status & ~SPKRON));
  36. }